"""
Ближайшие дни родления участников чата.

Author: Milinuri Nirvalen
Ver: 1.2.1 (5)
"""

from chiori import Plugin

import datetime

from dateutil.relativedelta import relativedelta


p = Plugin(name='дни рождения', backend='vk',
	desc='дни рождения пользователей чата')

# func
# ====

def plural_form(n, v):
	"""Функция возвращает число и просклонённое слово после него

	:param n: число
	:param v: варианты слова в формате (для 1, для 2, для 5)

	Пример:
	plural_form(difference.days, ("день", "дня", "дней"))

	:return: Число и просклонённое слово после него"""

	return f"{n} {v[2 if (4 < n % 100 < 20) else (2, 0, 1, 1, 1, 2)[min(n % 10, 5)]]}"


def age(date):
	"""Возвращает возраст в годах по дате рождения

	Функция
	:param date: дата рождения
	:return: возраст"""

	# Get the current date
	now = datetime.datetime.utcnow()
	now = now.date()

	# Get the difference between the current date and the birthday
	res = relativedelta(now, date)
	return res.years


# commands
# ========

@p.command('birthday(s)', 'др',
	check_func='isChioAdmin', else_func='chioNotAdmin',
	usage='дни рождения участников беседы')
async def chatBirthdays(event, ctx):
	if not event.get('to.is_chat'):
		message = f"✨ Ваш день рождения :\n"
	else:
		message = f"✨ Дни рождения в беседе:\n"

	profiles = event.get('to.profiles')

	data = []
	now = datetime.datetime.today().date()

	for k, v in profiles.items():
		if "bdate" not in v or "deactivated" in v:
				continue

		try:
			if v['bdate'].count(".") > 1:
				year = True
				user_date = datetime.datetime.strptime(v['bdate'], '%d.%m.%Y').date()

			else:
				year = False
				user_date = datetime.datetime.strptime(v['bdate'], '%d.%m').date()

		except ValueError:
			continue

		try:
			check_date = user_date.replace(year=now.year)
		except ValueError:
			check_date = user_date + (datetime.date(now.year, 1, 1) - datetime.date(user_date.year, 1, 1))

		difference = check_date - now

		if difference.days < 0:
			check_date = check_date.replace(year=now.year + 1)
			difference = check_date - now

		bdate_in = "🌟 через " + plural_form(difference.days, ("день", "дня", "дней"))
		if year:
			bdate_in += " 🎉 исполнится " + plural_form(age(user_date) + 1, ("год", "года", "лет"))

		data.append((f"-- [{user_date.strftime('%d.%m')}] {v['name']} ({bdate_in})", difference.days))

	if len(data) < 30:
		message += "\n".join(d[0] for d in sorted(data, key=lambda x: x[1]))
	else:
		i = 0
		for d in sorted(data, key=lambda x: x[1]):
			message += "\n".join(d[0])
			i += 1

			if i > 30:
				break

	await ctx.message(message)
